/*
 *promise是es6新增的一种解决异步的方案，主要解决的是回调函数的回调地狱问题。
 *promise有三种状态，pending(进行中), fulfilled(已成功)，rejected(已失败)。状态只能从进行中变成成功或者失败，不能回来了
 *promise有很多的api，三种原型方法(then/catch/finally),以及很多静态方法(all/race/allSettled/any/resolve/reject)
 */

// 创建promise
// const done = true;
// const p1 = new Promise((resolve, reject) => {
//   setTimeout(() => {
//     if (done) {
//       resolve("123");
//     } else {
//       reject("456");
//     }
//   }, 2000);
// });

// 消费promise
// p1.then((res) => {
//   console.log(res);
//   return "999";
// })
//   .then((res2) => {
//     console.log(res2);
//   })
//   .catch((err) => {
//     console.log(err);
//   })
//   .finally(() => {
//     console.log("finally");
//   });

const done = true;
const p1 = new Promise((resolve, reject) => {
  setTimeout(() => {
    if (done) {
      resolve("ok1");
    } else {
      reject("不ok1");
    }
  }, 2000);
});
const p2 = new Promise((resolve, reject) => {
  if (!done) {
    resolve("ok2");
  } else {
    reject("不ok2");
  }
});
// Promise.all要接受一个数组作为参数，是一个由promise对象组成的数组
// Promise.all执行又会返回一个promise对象
// 如果都是成功的，那么返回这些promise对象成功的结果组成的数组
// 只要有一个失败，就返回最先失败的那个结果
// Promise.all([p1, p2])
//   .then((res) => {
//     console.log(1);
//     console.log(res);
//   })
//   .catch((err) => {
//     console.log(2);
//     console.log(err);
//   });

// const prmsall = (arr) => {
//   return new Promise((resolve, reject) => {
//     // 1. 判断是一个数组
//     // 2. 判断arr里面的每一个promise对象是否否能成功
//   });
// };
// prmsall();

// 也要接受一个promise对象组成的数组
// 返回第一个出结果的那个promise对象的结果
Promise.race([p1, p2])
  .then((res) => {
    console.log(res);
  })
  .catch((err) => {
    console.log(err);
  });
